package database

import (
	"fmt"
	"time"

	"pbj-server/config"
	"pbj-server/pkg/logger"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	gormlogger "gorm.io/gorm/logger"
)

var (
	DB *gorm.DB
)

// GormWriter 实现GORM的Writer接口
type GormWriter struct{}

// Printf 实现GORM Writer接口的Printf方法
func (w *GormWriter) Printf(format string, args ...interface{}) {
	logger.Infof(format, args...)
}

// Init 初始化数据库连接
func Init() error {
	cfg := config.GetConfig()
	
	// 获取数据库连接字符串
	dsn := cfg.GetMySQLDSN()
	
	// 配置GORM日志
	gormLogger := gormlogger.New(
		&GormWriter{},
		gormlogger.Config{
			SlowThreshold:             time.Second,     // 慢SQL阈值
			LogLevel:                  gormlogger.Info,     // 日志级别
			IgnoreRecordNotFoundError: true,            // 忽略记录未找到错误
			Colorful:                  false,           // 禁用彩色输出
		},
	)
	
	// 连接数据库
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
		Logger: gormLogger,
	})
	if err != nil {
		return fmt.Errorf("连接数据库失败: %v", err)
	}
	
	// 获取底层sql.DB对象
	sqlDB, err := db.DB()
	if err != nil {
		return fmt.Errorf("获取数据库实例失败: %v", err)
	}
	
	// 设置连接池参数
	sqlDB.SetMaxIdleConns(cfg.MySQL.MaxIdle)
	sqlDB.SetMaxOpenConns(cfg.MySQL.MaxOpen)
	sqlDB.SetConnMaxLifetime(time.Hour)
	
	// 测试数据库连接
	if err := sqlDB.Ping(); err != nil {
		return fmt.Errorf("数据库连接测试失败: %v", err)
	}
	
	DB = db
	logger.Info("MySQL数据库连接成功")
	
	return nil
}

// Close 关闭数据库连接
func Close() error {
	if DB != nil {
		sqlDB, err := DB.DB()
		if err != nil {
			return err
		}
		return sqlDB.Close()
	}
	return nil
}

// GetDB 获取数据库实例
func GetDB() *gorm.DB {
	return DB
}

// Transaction 执行数据库事务
func Transaction(fc func(tx *gorm.DB) error) error {
	return DB.Transaction(fc)
}

// Begin 开始事务
func Begin() *gorm.DB {
	return DB.Begin()
}

// Commit 提交事务
func Commit() *gorm.DB {
	return DB.Commit()
}

// Rollback 回滚事务
func Rollback() *gorm.DB {
	return DB.Rollback()
} 